﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using tea.DB;
using Util;
using tea.BL;

namespace tea.Tests
{
    class DB
    {
        public static void 초기화()
        {
            using (var db = new DBDataContext())
                db.DB초기화();
        }

        //// 사용자
        public static bool 사용자_존재하나(string 아이디)
        {
            using (var db = new DBDataContext())
                return db.사용자.Any(p => p.로그인ID == 아이디);
        }

        public static bool 비밀번호_일치하나(string 아이디, string 비밀번호)
        {
            using (var db = new DBDataContext()) {
                var n = db.사용자.First(p => p.로그인ID == 아이디);
                return n.비밀번호 == CryptographyHelper.CookieEncrypt(비밀번호);
            }
        }

        public static void 비밀번호변경(string 아이디, string 새비밀번호)
        {
            using (var db = new DBDataContext()) {
                var n = db.사용자.Single(p => p.로그인ID == 아이디);
                n.비밀번호 = CryptographyHelper.CookieEncrypt(새비밀번호);
                db.SubmitChanges();
            }
        }

        public static void 사용자삭제(string 아이디)
        {
            using (var db = new DBDataContext()) {
                var n = db.사용자.FirstOrDefault(p => p.로그인ID == 아이디);
                if (n != null) {
                    db.덧글.DeleteAllOnSubmit(db.덧글.Where(p => p.사용자ID == n.ID));
                    foreach (var 게시글 in db.게시글.Where(p => p.작성자ID == n.ID)) {
                        db.파일첨부.DeleteAllOnSubmit(db.파일첨부.Where(p => p.대상ID == 게시글.ID && (p.대상유형 == BL파일.파일첨부_게시글첨부파일 || p.대상유형 == BL파일.파일첨부_게시글이미지파일)));
                        db.게시글.DeleteOnSubmit(게시글);
                    }
                    db.파일첨부.DeleteAllOnSubmit(db.파일첨부.Where(p => p.대상ID == n.ID && (p.대상유형 == BL파일.파일첨부_이력서사진 || p.대상유형 == BL파일.파일첨부_이력서사진)));
                    db.파일.DeleteAllOnSubmit(db.파일.Where(p => p.파일첨부.Count <= 0));
                    db.이력서_경력.DeleteAllOnSubmit(db.이력서_경력.Where(p => p.사용자ID == n.ID));
                    db.이력서_학력.DeleteAllOnSubmit(db.이력서_학력.Where(p => p.사용자ID == n.ID));
                    db.이력서_논문.DeleteAllOnSubmit(db.이력서_논문.Where(p => p.사용자ID == n.ID));
                    db.이력서.DeleteAllOnSubmit(db.이력서.Where(p => p.사용자ID == n.ID));
                    foreach (var 지원 in db.지원.Where(p => p.사용자ID == n.ID)) {
                        db.지원_강의.DeleteAllOnSubmit(지원.지원_강의);
                        db.지원.DeleteOnSubmit(지원);
                    }
                    db.사용자.DeleteOnSubmit(n);
                    db.SubmitChanges();
                }
            }
        }

        public static void 사용자생성(string 아이디, string 비밀번호, string 이름, string 이메일)
        {
            using (var db = new DBDataContext()) {
                db.사용자.InsertOnSubmit(new 사용자 { 로그인ID = 아이디, 비밀번호 = CryptographyHelper.CookieEncrypt(비밀번호), 이름 = 이름, 이메일 = 이메일 });
                db.SubmitChanges();
            }
        }

        public static int 채용생성(DateTime 기간1, DateTime 기간2, string 내용)
        {
            using (var db = new DBDataContext()) {
                var n = new 채용 { 내용 = 내용, 번호 = 1, 신청기간1 = 기간1, 신청기간2 = 기간2, 임용년도 = 2000 };
                db.채용.InsertOnSubmit(n);
                db.SubmitChanges();
                return n.ID;
            }
        }

        public static int 채용수정(int id, DateTime 기간1, DateTime 기간2)
        {
            using (var db = new DBDataContext()) {
                var n = db.채용.Single(p => p.ID == id);
                n.신청기간1 = 기간1;
                n.신청기간2 = 기간2;
                db.SubmitChanges();
                return n.ID;
            }
        }

        public static void 이력서생성(string 로그인ID, string 생년월일, string 성별)
        {
            using (var db = new DBDataContext()) {
                var 사용자ID = db.사용자.Single(p => p.로그인ID == 로그인ID).ID;
                var n = new 이력서 { 사용자ID = 사용자ID, 생년월일 = 생년월일, 성별 = 성별 };
                db.이력서.InsertOnSubmit(n);
                db.SubmitChanges();
            }
        }

        public static void 이력서수정(string 로그인ID, string 생년월일, string 성별)
        {
            using (var db = new DBDataContext()) {
                var 사용자 = db.사용자.Single(p => p.로그인ID == 로그인ID);
                var 이력서 = db.이력서.Single(p => p.사용자ID == 사용자.ID);
                이력서.생년월일 = 생년월일;
                이력서.성별 = 성별;
                db.SubmitChanges();
            }
        }

        public static void 이력서학력생성(string 로그인ID, string 구분, string 국가 = null, string 기간1 = null, string 기간2 = null, string 학교명 = null, string 학과 = null, string 전공 = null)
        {
            using (var db = new DBDataContext()) {
                var 사용자ID = db.사용자.Single(p => p.로그인ID == 로그인ID).ID;
                var n = new 이력서_학력 { 사용자ID = 사용자ID, 구분 = 구분, 국가 = 국가, 기간1 = 기간1, 기간2 = 기간2, 학교명 = 학교명, 학과 = 학과, 전공 = 전공 };
                db.이력서_학력.InsertOnSubmit(n);
                db.SubmitChanges();
            }
        }

        public static void 강의생성(string 학기, string 강의명, bool 중단 = false)
        {
            using (var db = new DBDataContext()) {
                var n = new 강의 { 학기 = 학기, 강의명 = 강의명, 중단 = 중단 };
                db.강의.InsertOnSubmit(n);
                db.SubmitChanges();
            }
        }

        public static int 지원생성(string 로그인ID, int? 채용ID = null, DateTime? 신청일 = null, DateTime? 승인일 = null)
        {
            if (신청일 == null) 신청일 = DateTime.Now;

            using (var db = new DBDataContext()) {
                if (채용ID == null) 채용ID = db.채용.OrderByDescending(p => p.ID).First().ID;
                var 사용자 = db.사용자.Single(p => p.로그인ID == 로그인ID);
                var 지원 = new 지원 { 사용자ID = 사용자.ID, 채용ID = 채용ID.Value, 신청일 = 신청일.Value, 승인일 = 승인일 };
                db.지원.InsertOnSubmit(지원);
                db.SubmitChanges();
                return 지원.ID;
            }
        }

        public static int 지원강의생성(int 지원ID, string 강의명)
        {
            using (var db = new DBDataContext()) {
                var 강의ID = db.강의.Single(p => p.강의명 == 강의명).ID;
                var 지원강의 = new 지원_강의 { 강의ID = 강의ID, 지원ID = 지원ID };
                db.지원_강의.InsertOnSubmit(지원강의);
                db.SubmitChanges();
                return 지원강의.ID;
            }
        }
        

    }
}
